package co.edu.uniquindio.ondas.negocio;

import java.util.List;

import co.edu.uniquindio.ondas.dtos.ResumenComentarioDTO;
import co.edu.uniquindio.ondas.dtos.ResumenInvestigacionGrupoDTO;
import co.edu.uniquindio.ondas.entidades.Actividad;
import co.edu.uniquindio.ondas.entidades.Asesor;
import co.edu.uniquindio.ondas.entidades.Bitacora1Maestro;
import co.edu.uniquindio.ondas.entidades.Bitacora2;
import co.edu.uniquindio.ondas.entidades.Bitacora2Maestro;
import co.edu.uniquindio.ondas.entidades.Bitacora3;
import co.edu.uniquindio.ondas.entidades.Bitacora3Maestro;
import co.edu.uniquindio.ondas.entidades.Bitacora4Maestro;
import co.edu.uniquindio.ondas.entidades.Comentario;
import co.edu.uniquindio.ondas.entidades.ComentarioAsesor;
import co.edu.uniquindio.ondas.entidades.Consulta;
import co.edu.uniquindio.ondas.entidades.Convocatoria;
import co.edu.uniquindio.ondas.entidades.Encuesta;
import co.edu.uniquindio.ondas.entidades.Estudiante;
import co.edu.uniquindio.ondas.entidades.Grupo;
import co.edu.uniquindio.ondas.entidades.InformeAvanceTecnico;
import co.edu.uniquindio.ondas.entidades.InformeFinal;
import co.edu.uniquindio.ondas.entidades.Maestro;
import co.edu.uniquindio.ondas.entidades.RespuestaComentario;
import co.edu.uniquindio.ondas.entidades.RespuestaConsulta;
import co.edu.uniquindio.ondas.entidades.Segmento;
import co.edu.uniquindio.ondas.entidades.VisitaProgramada;
/**
 * @author Javier
 *Interface que define los metodos  para el GrupoEJB
 *permite realizar las operaciones del Grupo
 */
public interface GrupoEJBInterface {

	/**
	 * Metodo que permite iniciar una Sesion a un Grupo
	 * 
	 * @param login
	 * @param clave
	 * @return operador logico (indica inicio sesion o no)
	 */
	public boolean inicioSesionGrupo(String login, String clave);

	/**
	 * Metodo que permite registrar una Bitacora1
	 * 
	 * @param grupo
	 * @param nombreSede
	 * @param nombreMunicipio
	 * @return Mensaje (indica si el registro esta en el rango de fechas
	 *         permitido )
	 */
	public String crearBitacora1Grupo(Grupo grupo, String nombreSede,
			String nombreMunicipio);

	/**
	 * Metodo que permite registrar en el sistema un nuevo Estudiante
	 * 
	 * @param estudiante
	 * @param grupoLogin
	 * @return Operador Logico (Indica creado, no Creado)
	 */
	public boolean crearEstudianteGrupo(Estudiante estudiante, String grupoLogin);

	/**
	 * Metodo que permite registrar en el sistema un nuevo Maestro en un Grupo
	 * 
	 * @param maestro
	 * @param grupoLogin
	 * @return operador logico (indica creado, no creado)
	 */
	public boolean crearMaestroGrupo(Maestro maestro, String grupoLogin);

	/**
	 * Metodo que permite registrar en el sistema un nuevo Bitacora2 en un Grupo
	 * 
	 * @param bitacora2
	 * @param idInvestigacion
	 * @param estado
	 * @return operador logico (indica creado, no creado)
	 */
	public boolean crearBitacora2Grupo(Bitacora2 bitacora2,
			long idInvestigacion, boolean estado);

	/**
	 * Metodo que permite consulta si hay o no investigaciones
	 * 
	 * @param login
	 * @return operador logico (indica existen investigaciones, o no existen )
	 */
	public boolean tieneInvestigacion(String login);

	/**
	 * Metodo que permite crear una Investigacion
	 * 
	 * @param login
	 * @return DTO ResumenInvestiacioGrupo
	 */
	public ResumenInvestigacionGrupoDTO crearInvestigacion(String login);

	/**
	 * Metodo que permite devolver la investigacion de un grupo a partir de
	 * login de usuario
	 * 
	 * @param login
	 * @return listado del resumen de la investigacion del Grupo
	 */
	public List<ResumenInvestigacionGrupoDTO> getInvestigacionGrupo(String login);

	/**
	 * Metodo que permite crear en el sistema una nueva Bitacora3Grupo
	 * 
	 * @param bitacora3
	 * @param inSeleccionada
	 * @param estado
	 * @return operador logico (indica creado o no creado)
	 */
	public boolean crearBitacora3Grupo(Bitacora3 bitacora3,
			long inSeleccionada, boolean estado);

	/**
	 * Metodo que permite crear en el sistema una nueva Bitacora1Maestro
	 * 
	 * @param bitacora1Maestro
	 * @param inSeleccionada
	 * @param estado
	 * @return operador logico (indica creado o no creado)
	 */
	public boolean crearBitacora1Maestro(Bitacora1Maestro bitacora1Maestro,
			long inSeleccionada, boolean estado);

	/**
	 * Metodo que permite crear en el sistema una nueva Bitacora2Maestro
	 * 
	 * @param bitacora2Maestro
	 * @param inSeleccionada
	 * @param estado
	 * @return operador logico (indica creado o no creado)
	 */
	public boolean crearBitacor2Maestro(Bitacora2Maestro bitacora2Maestro,
			long inSeleccionada, boolean estado);

	/**
	 * Metodo que permite crear en el sistema una nueva Bitacora3Maestro
	 * 
	 * @param bitacora3Maestro
	 * @param inSeleccionada
	 * @param estado
	 * @return operador logico (indica creado o no creado)
	 */
	public boolean crearBitacora3Maestro(Bitacora3Maestro bitacora3Maestro,
			long inSeleccionada, boolean estado);

	/**
	 * Metodo que permite crear en el sistema una nueva Bitacora4Maestro
	 * 
	 * @param bitacora4Maestro
	 * @param inSeleccionada
	 * @param estado
	 * @return operador logico (indica creado o no creado)
	 */
	public boolean crearBitacora4Maestro(Bitacora4Maestro bitacora4Maestro,
			long inSeleccionada, boolean estado);

	/**
	 * Metodo que permite crear en el sistema una nuevo Informe de Avance
	 * Tecnico
	 * 
	 * @param informeAvanceTecnico
	 * @param inSeleccionada
	 * @param estado
	 * @return operador logico (indica creado o no creado)
	 */
	public boolean crearInformeAvanceTecnico(
			InformeAvanceTecnico informeAvanceTecnico, long inSeleccionada,
			boolean estado);

	/**
	 * Metodo que permite crear en el sistema una nuevo Formato de visitas
	 * programadas
	 * 
	 * @param visitaProgramada
	 * @param inSeleccionada
	 * @param estado
	 * @return operador logico (indica creado o no creado)
	 */
	public boolean crearFormatoVisitasProgramadas(
			VisitaProgramada visitaProgramada, long inSeleccionada,
			boolean estado);

	/**
	 * Metodo que permite crear en el sistema una nuevo Segmento
	 * 
	 * @param segmento1
	 * @param segmento2
	 * @param segmento3
	 * @param idInvestigacion
	 * @param estado
	 * @return operador logico (indica creado o no creado)
	 */
	public boolean crearSegmento(Segmento segmento1, Segmento segmento2,
			Segmento segmento3, long idInvestigacion, boolean estado);

	/**
	 * Metodo que permite crear una nueva Actividad en el sistema
	 * 
	 * @param actividad
	 * @param inSeleccionada
	 * @param estado
	 * @return operador logico (indica creado o no creado)
	 */
	public boolean crearActividad(Actividad actividad, long inSeleccionada,
			boolean estado);

	/**
	 * @param informeFinal
	 * @param inSeleccionada
	 * @param estado
	 * @return operador logico (indica creado o no creado)
	 */
	public boolean crearInformeFinal(InformeFinal informeFinal,
			long inSeleccionada, boolean estado);

	/**
	 * Metodo que permite obtener una lista de Segmentos que pertenece a una
	 * Investigacion
	 * 
	 * @param idBitacora
	 * @return Lista de Segmentos
	 */
	public List<Segmento> obtenerSegmentosInvestigaicon(long idBitacora);

	/**
	 * Metodo que permite obtener un Listado de las Actividades pertencientes a
	 * una investigacin
	 * 
	 * @param idInvestigacion
	 * @return Lista de Actividades
	 */
	public List<Actividad> obtenerActividadesInvestigacion(long idInvestigacion);

	/**
	 * Metodo que permite editar una Actividad registrada en el sistema
	 * 
	 * @param actividad
	 * @return operador logico (indica creado o no creado)
	 */
	public boolean editarActividad(Actividad actividad);

	/**
	 * Metodo que permite obtener el Asesor de una Ivestigacion
	 * 
	 * @param idInvestigacion
	 * @return Asesor
	 */
	public Asesor obtenerAsesorInvestigacion(long idInvestigacion);

	/**
	 * Metodo que permite obtener una Lista de Lineas Tematicas registradas en
	 * el sistema
	 * 
	 * @return Listado de Lineas
	 */
	public List<String> obtenerListaLineas();

	/**
	 * Metodo que permite obtener un listado de consultas de las Investigaciones
	 * 
	 * @param idInvestigacion
	 * @return Listado de Consultas
	 */
	public List<Consulta> obtenerConsultasInvestigacion(long idInvestigacion);

	/**
	 * Metodo que permite obtener las respuestas de cada una de las consultas
	 * 
	 * @param idConsulta
	 * @return Listado de Respuestas a Consultas
	 */
	public List<RespuestaConsulta> obtenerRespuestasConsulta(long idConsulta);

	/**
	 * Metodo que permite crear en el sistema una nueva consulta
	 * 
	 * @param consulta
	 * @param destino
	 * @param idInvestigacion
	 * @param estado
	 * @return operador logico (indica creado o no creado)
	 */
	public boolean crearConsulta(Consulta consulta, String destino,
			long idInvestigacion, boolean estado);

	/**
	 * Metodo que permite asignar una Linea Tematica
	 * 
	 * @param nombreInvestigacion
	 * @param nombreLinea
	 * @param idInvestigacion
	 * @return operador logico (indica asignado o no asignado)
	 */
	public boolean asignarLineaTematica(String nombreInvestigacion,
			String nombreLinea, long idInvestigacion);

	/**
	 * Metodo que permite obtener una lista con los comentarios del Asesor
	 * @param idInvestigacion
	 * @return Lista de comentarios Asesor
	 */
	public List<ComentarioAsesor> obtenerComentariosAsesor(long idInvestigacion);

	/**
	 * Metodo que permite obtener una Encuesta registrada en el sistema
	 * @param idInvestigacion
	 * @return Encuesta
	 */
	public Encuesta obtenerEncuestaInvestigacion(long idInvestigacion);

	/**
	 * Metodo que permite crear una nueva Encuesta en el sistema
	 * @param encuesta
	 * @param idInvestigacion
	 * @return operador logico (indica creado o no creado)
	 */
	public boolean crearEncuesta(Encuesta encuesta, long idInvestigacion);

	/**
	 * Metodo que permite obtener una listado de comentarios hechos con respecto a la investigacion
	 * @param idInvestigacion
	 * @return lista de comentarios de la Investigacion
	 */
	public List<Comentario> obtenerComentariosInvestigacion(long idInvestigacion);

	/**
	 * Metodo que permite obtener una listado con las respuestas a los comentarios 
	 * @param idComentario
	 * @return Lista de respuestas a comentarios
	 */
	public List<RespuestaComentario> obtenerRespuestasComentario(
			long idComentario);

	/**
	 * Metodo que permite crear en el sistema un nuevo comentario
	 * @param comentario
	 * @param idInvestigacion
	 * @return operador logico (indica creado o no creado)
	 */
	public boolean crearComentario(Comentario comentario, long idInvestigacion);

	/**
	 * Metodo que permite obtener un listado con los resumenes de los comentarios
	 * @param idInvestigacion
	 * @return Lista de resumnenes de Comentarios
	 */
	public List<ResumenComentarioDTO> obtenerResumenComentarios(
			long idInvestigacion);

	/**
	 * Metodo que permite crear una respuesta a un comentario hecho por un grupo
	 * @param respuesta
	 * @param idComentario
	 * @return operador logico (indica creado o no creado)
	 */
	public boolean crearRespuestaComentarioGrupo(RespuestaComentario respuesta,
			long idComentario);

	/**
	 * Metodo que permite obtener una Bitacora2 registrada en el sistema
	 * @param idInvestigacion
	 * @return Bitacora2
	 */
	public Bitacora2 getBitacora2(long idInvestigacion);

	/**
	 * Metodo que permite obtener una Bitacora3 registrada en el sistema
	 * @param idInvestigacion
	 * @return Bitacora3
	 */
	public Bitacora3 getBitacora3(long idInvestigacion);

	/**
	 *Metodo que permite obtener una Bitacora1Maestro registrada en el sistema
	 * @param idInvestigacion
	 * @return Bitacora1Maestro
	 */
	public Bitacora1Maestro getBitacora1Maestro(long idInvestigacion);

	/**
	 * Metodo que permite obtener una Bitacora2Maestro registrada en el sistema
	 * @param idInvestigacion
	 * @return Bitacora2Maestro
	 */
	public Bitacora2Maestro getBitacora2Maestro(long idInvestigacion);

	/**
	 * Metodo que permite obtener una Bitacora3Maestro registrada en el sistema
	 * @param idInvestigacion
	 * @return Bitacora3Maestro
	 */
	public Bitacora3Maestro getBitacora3Maestro(long idInvestigacion);

	/**
	 * Metodo que permite obtener una Bitacora4Maestro registrada en el sistema
	 * @param idInvestigacion
	 * @return Bitacora4Maestro
	 */
	public Bitacora4Maestro obtenerBitacora4Maestro(long idInvestigacion);

	/**
	 * Metodo que permite obtener un Informe de Avance Tecnico registrado en el sistema
	 * @param idInvestigacion
	 * @return Informe de Avance Tecnico
	 */
	public InformeAvanceTecnico obtenerAvanceTecnico(long idInvestigacion);

	/**
	 * Metodo que permite obtener un Listado de los estudiantes que pertenecen a un Grupo
	 * @param loginGrupo
	 * @return Listado de Estudiantes
	 */
	public List<Estudiante> obtenerEstudiantesGrupo(String loginGrupo);

	/**
	 * Metodo que permite obtener un listado de Maestros que pertenecientes a un Grupo
	 * @param loginGrupo
	 * @return Lista de Maestro por Grupo
	 */
	public List<Maestro> obtenerMaestrosGrupo(String loginGrupo);

	/**
	 * Metodo que permite editar la informacion de un Estudiante registrado en el sistema
	 * @param estudiante
	 * @return operador logico (indica creado o no creado)
	 */
	public boolean editarEstudiante(Estudiante estudiante);

	/**
	 * Metodo que permite eliminar la informacion de un Estudiante registrado en el sistema
	 * @param estudiante
	 * @return operador logico (indica editado o no editado)
	 */
	public boolean eliminarEstudiante(Estudiante estudiante);

	/**
	 * Metodo que permite editar la informacion de un Maestro registrado en el sistema
	 * @param maestro
	 * @return operador logico (indica creado o no creado)
	 */
	public boolean editarMaestro(Maestro maestro);

	/**
	 * Metodo que permite eliminar a un Maestro del grupo
	 * @param maestro
	 * @return operador logico (indica eliminado o no eliminado)
	 */
	public boolean eliminarMaestro(Maestro maestro);
	/**
	 * Metodo que permite obtener las convocatorias activas
	 * @return Convocatoria Activa
	 */
	public Convocatoria obtenerConvocatoriaActiva();

	/**
	 * Metodo que me permite obtener un Informe Final de una Investigacion
	 * @param idInvestigacion
	 * @return Informe Final
	 */
	public InformeFinal obtenerInformeFinal(long idInvestigacion);
}
